// use anyhow::Result;
// use tracing::error;
// use jizi_shared::env_exists;
// 
// use crate::{CLOSE,ESCAPE,Emulator,NVIM,START,TMUX} ;
// 
// pub struct Mux;
// 
// impl Mux{
//     /// 将字符串转换为CSI（Control Sequence Introducer）格式，用于在终端中发送控制序列。
//     pub fn csi(s:&str) -> std::borrow::Cow<str>{
//         if *TMUX == 2 && !*NVIM{  /// 这啥意思？
//             // s转成csi模式
//             std::borrow::Cow::Owned(format!(
//                 "{}{}{}",
//                 *START ,  // 控制序列的开始标记
//                 s.trim_start_matches('\x1b').replace('\x1b',*ESCAPE) , // 将字符串中的ESC字符替换为ESCAPE字符。
//                 *CLOSE , 
//             ))
//         }else {
//             std::borrow::Cow::Borrowed(s)  // 直接返回该字符串就行
//         }
//     }
//     pub fn tmux_passthrough() -> u8 {
//         if !env_exists("TMUX_PANE") || !env_exists("TMUX") {
//             return 0 ;
//         }
//         let child = std::process::Command::new("tmux")
//         .args(["set" , "-p" , "allow-passthrough" , "on"]) 
//         .stdin(std::process::Stdio::null()) 
//         .stdout(std::process::Stdio::null()) 
//         .stderr(std::process::Stdio::piped())
//         .spawn() ;
//         
//         match child.and_then(|c| c.wait_with_output()){
//             Ok(output) if output.status.success() => return 2 , // 子进程运行成功返回2  
//             Ok(output) => {
//                 error!(
//                     "Running `tmux set -p allow-passthrough on` failed: {:?}, {}" ,
//                     output.status , 
//                     String::from_utf8_lossy(&output.stderr) 
//                 ) ;
//             }
//             Err(err) => {
//                 error!("Fail to spawn 'tmux set -p allow-passthrough on`: {err}") ;
//             }
//         }
//         1
//     }
//     /// 在TMUX中发送DSR（Device Status Report）控制序列，以获取终端信息。  
//     /// TODO: 下面的代码还不是很明白  后续再继续研究
//     pub fn tmux_drain() -> Result<()> {
//         if *TMUX == 2 && !*NVIM {
//             crossterm::execute!(std::io::stderr(), crossterm::style::Print(Mux::csi("\x1b[5n")))?; // 发送DSR控制序列。
//             _ = futures::executor::block_on(Emulator::read_until_dsr()); // 等待终端返回DSR响应。
//         }
//         Ok(()) // 如果在TMUX中且不是Neovim，则返回Ok(())表示成功发送DSR控制序列。否则，直接返回Ok(())。
//     }
// 
//      /// 检查TMUX是否支持sixel编码。
//      /// TODO: 其底层原理择日再研究
//     pub fn tmux_sixel_flag() -> &'static str {
//         // 运行`tmux -LwU0dju1is5 -f/dev/null start ; display -p #{sixel_support}`命令以获取sixel支持信息。
//         let stdout = std::process::Command::new("tmux")
//             .args(["-LwU0dju1is5", "-f/dev/null", "start", ";", "display", "-p", "#{sixel_support}"])
//             .output()
//             .ok()
//             .and_then(|o| String::from_utf8(o.stdout).ok())
//             .unwrap_or_default(); // 如果命令执行失败，则使用默认值""。
// 
//         match stdout.trim() { // 根据输出结果判断是否支持sixel编码。
//             "1" => "Supported", // 如果输出结果为"1"，则表示支持sixel编码。
//             "0" => "Unsupported", // 如果输出结果为"0"，则表示不支持sixel编码。
//             _ => "Unknown", // 如果输出结果不为"1"或"0"，则表示未知是否支持sixel编码。
//         }
//     }
// 
//     /// 获取TMUX中的TERM和TERM_PROGRAM环境变量的值。
//     pub(super) fn term_program() -> (Option<String>, Option<String>) {
//         
//         let (mut term, mut program) = (None, None); // 初始化TERM和TERM_PROGRAM环境变量的值。
//         TMUX.init(Mux::tmux_passthrough());
//         if *TMUX == 0 { // 如果TMUX的值为0，则直接返回None。
//             return (term, program);
//         }
//         let Ok(output) = std::process::Command::new("tmux").arg("show-environment").output() else { // 运行`tmux show-environment`命令以获取环境变量信息。
//             return (term, program); // 如果命令执行失败，则直接返回None。
//         };
//         for line in String::from_utf8_lossy(&output.stdout).lines() { // 遍历输出结果中的每一行。
//             if let Some((k, v)) = line.trim().split_once('=') { // 如果行中包含等号，则将其拆分为键值对。
//                 println!("{},{}" , k,v) ;
//                 match k { // 根据键的值更新TERM和TERM_PROGRAM环境变量的值。
//                     "TERM" => term = Some(v.to_owned()), // 如果键为"TERM"，则更新TERM环境变量的值。
//                     "TERM_PROGRAM" => program = Some(v.to_owned()), // 如果键为"TERM_PROGRAM"，则更新TERM_PROGRAM环境变量的值。
//                     _ => continue, // 如果键不为"TERM"或"TERM_PROGRAM"，则继续下一行。
//                 }
//             }
//             if term.is_some() && program.is_some() { // 如果TERM和TERM_PROGRAM环境变量的值都不为None，则退出循环。
//                 break; // 退出循环。
//             }
//         }
//         (term, program) // 返回TERM和TERM_PROGRAM环境变量的值。
//     }
// }
// 
// 
// // #[test]
// // fn test_term_program() {
// //     let (term, program) = Mux::term_program();
// //     assert_eq!(term , None) ; 
// //     assert_eq!(program,None) ; 
// // }
